package com.are.odisea;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class GestionConsumos {

	private db conexion = null;
	private String usuario;

	public static final int OPERACION_INCREMENTAR = 1;
	public static final int OPERACION_DECREMENTAR = 2;
	public static final String TIPO_ORDEN_INSTALACION = "ODSINST";
	public static final String TIPO_ORDEN_MANTENIMIENTO = "ODSST";

	public static final int COMMIT_ON = 1;
	public static final int COMMIT_OFF = 0;

	public static final int ESTADO_CONFIRMAR = 1;
	public static final int ESTADO_ANULAR = 3;

	public boolean InstalarSerial(String id, String orden, String tipo,
			String cedula, int commit) throws SQLException {
		boolean resultado = false;
		String sql = "update seriales set serisoco=?,seripeco=?,seriods=? where serinuid=? and seriesta='E' and serisoco='-1' and seripeco='-1'";

		java.sql.PreparedStatement pst = conexion.getConnection()
				.prepareStatement(sql);
		pst.setString(1, orden);
		pst.setString(2, cedula);
		pst.setString(3, tipo);
		pst.setString(4, id);

		if (conexion.Update(pst) > 0) {
			if (commit == COMMIT_ON) {
				conexion.Commit();
			}
			resultado = true;

		}

		return resultado;
	}

	public boolean LiberarSerial(int id, int commit) throws SQLException {
		boolean resultado = false;

		String sql = "update seriales set serirete=0,serireso='-1',serirepe='-1',seriods='' "
				+ "where serinuid=? and seriesta='E' and serirete = 1 and serireso != '-1'";

		java.sql.PreparedStatement pst = conexion.getConnection()
				.prepareStatement(sql);
		pst.setInt(1, id);

		if (conexion.Update(pst) > 0) {
			if (commit == COMMIT_ON) {
				conexion.Commit();
			}
			resultado = true;

		}

		return resultado;
	}

	public boolean ReservarSerial(int id, String orden, String cedula)
			throws SQLException {
		boolean resultado = false;

		String sql = "update seriales set serirete=1,serireso=?,serirepe=? "
				+ "where serinuid=? and seriesta='E' and serirete = 0 and serireso ='-1'";

		java.sql.PreparedStatement pst = conexion.getConnection()
				.prepareStatement(sql);
		pst.setString(1, orden);
		pst.setString(2, cedula);
		pst.setInt(3, id);

		if (conexion.Update(pst) > 0) {
			// conexion.Commit();
			System.out.println("Id de serial actualizado: " + id);
			resultado = true;

		} else {
			throw new SQLException("Error al reservar el serial");
		}

		return resultado;
	}

	public double StockActual(String id) throws SQLException {
		double cantidad = -1;
		String sql = "select invemate, invepers,invebode,invecent from invepers where invenuid = ?";
		java.sql.PreparedStatement pst = conexion.getConnection()
				.prepareStatement(sql);
		pst.setString(1, id);
		ResultSet rs = conexion.Query(pst);
		if (rs.next()) {

			sql = "SELECT INVEMATE,SUM(INVECANT) INVECANT " + " FROM INVEPERS "
					+ " WHERE (INVEPERS=?) " + " AND (INVEMATE=?) "
					+ " AND (INVEBODE=?) " + " AND (INVECENT=?) "
					+ " GROUP BY INVEMATE ";
			pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1, rs.getString("invepers"));
			pst.setString(2, rs.getString("invemate"));
			pst.setString(3, rs.getString("invebode"));
			pst.setString(4, rs.getString("invecent"));
			ResultSet rs1 = conexion.Query(pst);
			if (rs1.next()) {
				cantidad = rs1.getDouble("INVECANT");
			} else {
				throw new SQLException(
						"Error al consultar la cantidad actual en el stock del tecnico");
			}

		} else {
			throw new SQLException(
					"Error consultar la informacion del ID de consumo");
		}
		return cantidad;
	}

	public double CantidadActual(int id) throws SQLException {
		double cantidad = 0;
		String sql = "select invecant from invepers where invenuid=?";
		java.sql.PreparedStatement pst = conexion.getConnection()
				.prepareStatement(sql);
		pst.setInt(1, id);
		ResultSet rs = conexion.Query(pst);
		if (rs.next()) {
			cantidad = rs.getDouble("invecant");
		} else {
			cantidad = -1; // no hay registro con el ID
		}

		return cantidad;
	}

	public double ReservaActual(int id) throws SQLException {
		double cantidad = 0;
		String sql = "select invecare from invepers where invenuid=?";
		java.sql.PreparedStatement pst = conexion.getConnection()
				.prepareStatement(sql);
		pst.setInt(1, id);
		ResultSet rs = conexion.Query(pst);
		if (rs.next()) {
			cantidad = rs.getDouble("invecare");
		} else {
			cantidad = -1; // no hay registro con el ID
		}

		return cantidad;
	}

	public boolean AgregarConsumoOrden(String id, String orden, String tipo,
			String cedula, double cantidad, String serial, String casid,
			String id_serial, String tipomaterial, int commit)
			throws SQLException {
		boolean resultado = false;

		String sql = "select * from invepers where invenuid=?";
		java.sql.PreparedStatement pst = conexion.getConnection()
				.prepareStatement(sql);
		pst.setString(1, id);
		ResultSet rsInvepers = conexion.Query(pst);
		if (rsInvepers.next()) {
			// Realizar el insert a la tabla consuods
			sql = "insert into consuods (comacodi,comamate,comatipo,comaprov,"
					+ "comacant,comafesi,comapers,comaods,comatima,comaseri,"
					+ "comacaid,comadepa,comabode,comacent,comaesma,comaentr,comanuid) "
					+ "values (?,?,?,?,?,sysdate(),?,?,?,?,?,?,?,?,?,?,?)";
			pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1, orden);
			pst.setString(2, rsInvepers.getString("invemate"));
			pst.setString(3, "C");
			pst.setString(4, rsInvepers.getString("inveprov"));
			pst.setDouble(5, cantidad);
			pst.setString(6, cedula);
			pst.setString(7, tipo);
			pst.setString(8, tipomaterial);
			pst.setString(9, serial);
			pst.setString(10, casid);
			pst.setString(11, rsInvepers.getString("invedepa"));
			pst.setString(12, rsInvepers.getString("invebode"));
			pst.setString(13, rsInvepers.getString("invecent"));
			pst.setString(14, rsInvepers.getString("inveesma"));
			pst.setString(15, rsInvepers.getString("inveentr"));
			pst.setString(16, id_serial);
			if (conexion.Update(pst) > 0) {
				if (commit == COMMIT_ON) {
					conexion.Commit();
				}
				resultado = true;
			}

		}

		return resultado;

	}

	public boolean ActualizarStock(String id, double cantidad, int operacion,
			int commit) throws SQLException {
		boolean resultado = false;
		String sql = "select * from invepers where invenuid=? for update";
		java.sql.PreparedStatement pst = conexion.getConnection()
				.prepareStatement(sql);
		pst.setString(1, id);
		ResultSet rs = conexion.Query(pst);
		if (rs.next()) { // se encontro el registro y se puede bloquear
			switch (operacion) {
			case OPERACION_INCREMENTAR:
				sql = "update invepers set invecant = invecant + ? where invenuid=?";
				pst = conexion.getConnection().prepareStatement(sql);
				pst.setDouble(1, cantidad);
				pst.setString(2, id);
				if (conexion.Update(pst) > 0) {
					if (commit == COMMIT_ON) {
						conexion.Commit();
					}
					resultado = true;
				}
				break;
			case OPERACION_DECREMENTAR: // restar al stock del tecnico
				if (rs.getDouble("invecant") < cantidad) {
					throw new SQLException(
							"La cantidad a descontar supera el stock del tecnico");
				} else {
					sql = "update invepers set invecant = invecant - ? where invenuid=?";
					pst = conexion.getConnection().prepareStatement(sql);
					pst.setDouble(1, cantidad);
					pst.setString(2, id);
					if (conexion.Update(pst) > 0) {
						if (commit == COMMIT_ON) {
							conexion.Commit();
						}
						resultado = true;
					}

				}

				break;
			}

		}

		return resultado;
	}

	public boolean Kardex(String id, String orden, String tipo,
			double cantidad, double cantidad_actual, int operacion, int commit)
			throws SQLException {
		boolean resultado = false;
		String sql = "select * from invepers where invenuid=?";
		java.sql.PreparedStatement pst = conexion.getConnection()
				.prepareStatement(sql);
		pst.setString(1, id);
		ResultSet rsInvepers = conexion.Query(pst);
		if (rsInvepers.next()) {
			sql = "insert into movipers (mopepers,mopemate,mopecaan,mopecant,"
					+ "mopecade,mopetipo,mopefesi,mopeuser,mopedocu,mopedepa,"
					+ "mopebode,mopecent,mopeprov,mopeesma,mopeentr) "
					+ "values (?,?,?,?," + "?,?,sysdate(),?,?,?,"
					+ "?,?,?,?,?)";

			pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1, rsInvepers.getString("invepers"));
			pst.setString(2, rsInvepers.getString("invemate"));
			pst.setDouble(3, cantidad_actual);
			pst.setDouble(4, cantidad);
			double cantidad_despues = 0;
			String strtipo = "";
			switch (operacion) {
			case OPERACION_INCREMENTAR:
				cantidad_despues = cantidad_actual + cantidad;
				strtipo = "DEL_";
				break;
			case OPERACION_DECREMENTAR:
				cantidad_despues = cantidad_actual + cantidad;
				strtipo = "ADD_";
				break;
			}
			pst.setDouble(5, cantidad_despues);
			pst.setString(6, strtipo + tipo);
			pst.setString(7, usuario);
			pst.setString(8, orden);
			pst.setString(9, rsInvepers.getString("invedepa"));
			pst.setString(10, rsInvepers.getString("invebode"));
			pst.setString(11, rsInvepers.getString("invecent"));
			pst.setString(12, rsInvepers.getString("inveprov"));
			pst.setString(13, rsInvepers.getString("inveesma"));
			pst.setString(14, rsInvepers.getString("inveentr"));

			if (conexion.Update(pst) > 0) {
				if (commit == COMMIT_ON) {
					conexion.Commit();
				}
				resultado = true;
			}
		}

		return resultado;
	}

	public boolean Add(Consumos consumo, int commit) throws SQLException {
		boolean result = false;
		String sql = "INSERT INTO consumos (cedula,id_consumo,tipo_consumo,orden,tipo_orden,cantidad,usuario,fecha,estado) values (?,?,?,?,?,?,?,sysdate(),0)";
		java.sql.PreparedStatement pst = conexion.getConnection()
				.prepareStatement(sql);
		pst.setString(1, consumo.getCedula());
		pst.setInt(2, consumo.getId_consumo());
		pst.setInt(3, consumo.getTipo_consumo());
		pst.setString(4, consumo.getOrden());
		pst.setString(5, consumo.getTipo_orden());
		pst.setDouble(6, consumo.getCantidad());
		pst.setString(7, consumo.getUsuario());

		if (conexion.Update(pst) > 0) {
			System.out.println("Registro consumos guardado");

			if (consumo.getTipo_consumo() == 1) { // materiales
				if (ActualizarReservaInventario(consumo.getId_consumo(),
						consumo.getCantidad(), OPERACION_INCREMENTAR)) {
					result = true;
					if (commit == COMMIT_ON) {
						conexion.Commit();
					}
				}
			} else { // Seriales
				int id_stock = getIdStockByIdSerial(consumo.getId_consumo());
				System.out.println("Aplicando serial al consumo: ID_STOCK= "
						+ id_stock + " ID_SERIAL= " + consumo.getId_consumo());
				if (id_stock > 0) {
					if (ActualizarReservaInventario(id_stock,
							consumo.getCantidad(), OPERACION_INCREMENTAR)) {

						if (ReservarSerial(consumo.getId_consumo(),
								consumo.getOrden(), consumo.getCedula())) {

							if (commit == COMMIT_ON) {
								conexion.Commit();
							}
							result = true;
						} else {
							throw new SQLException(
									"Error al reservar el serial");
						}
					} else {
						throw new SQLException("Error al reservar inventario");
					}
				} else {
					throw new SQLException(
							"Error al consultar el ID de stok del tecnico");
				}

			}
		}

		return result;
	}

	public boolean ActualizarReservaInventario(int id, double cantidad, int tipo)
			throws SQLException {
		boolean result = false;

		double stock_actual = this.CantidadActual(id);
		double cantidad_reserva = this.ReservaActual(id);
		System.out.println("Cantidad Reserva antes del movimiento: " + cantidad_reserva);

		if (tipo == OPERACION_INCREMENTAR) {
			if ((stock_actual - cantidad_reserva) >= cantidad) {
				String sql = "update invepers set invecare = invecare + ? where invenuid = ?";
				java.sql.PreparedStatement pst = conexion.getConnection()
						.prepareStatement(sql);
				pst.setDouble(1, cantidad);
				pst.setInt(2, id);

				if (conexion.Update(pst) > 0) {
					stock_actual = this.CantidadActual(id);
					cantidad_reserva = this.ReservaActual(id);
					if ((stock_actual - cantidad_reserva) < 0) {
						throw new SQLException(
								"Infraccion al actualizar la cantidad de la bodega virtual del tecnico (INCREMENTAR)");
					}
					result = true;
				}
			} else {
				throw new SQLException(
						"No hay stock suficienciente para realizar la reserva");
			}
		} else { // OPERACION DISMINUIR RESERVA
			if (cantidad_reserva >= cantidad) {
				String sql = "update invepers set invecare = invecare - ? where invenuid = ?";
				java.sql.PreparedStatement pst = conexion.getConnection()
						.prepareStatement(sql);
				pst.setDouble(1, cantidad);
				pst.setInt(2, id);

				if (conexion.Update(pst) > 0) {
					cantidad_reserva = this.ReservaActual(id);
					System.out.println("Cantidad despues del movimiento: " + cantidad_reserva);
					if (cantidad_reserva < 0) {
						throw new SQLException(
								"Infraccion al actualizar la cantidad reservada en bodega virtual del tecnico (DECREMENTAR)");
					}
					result = true;
				}
			} else {
				throw new SQLException(
						"No hay cantidad para disminuir la reserva. Id = " + id + " cantidad = " + cantidad + " cantidad reserva = " + cantidad_reserva);
			}

		}

		return result;
	}

	public GestionConsumos(db conexion) {
		super();
		this.conexion = conexion;
	}

	public GestionConsumos(db conexion, String usuario) {
		super();
		this.conexion = conexion;
		this.usuario = usuario;
	}

	public db getConexion() {
		return conexion;
	}

	public void setConexion(db conexion) {
		this.conexion = conexion;
	}

	public String getUsuario() {
		return usuario;
	}

	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}

	public int getIdStockByIdSerial(int id) throws SQLException {
		int result = -1;
		String sql = "select seribode,seridepa,serimate,serientr,sericent,seriprov,seripers,seriesma from seriales where serinuid =?";
		java.sql.PreparedStatement pst = conexion.getConnection()
				.prepareStatement(sql);
		pst.setInt(1, id);
		ResultSet rs = conexion.Query(pst);
		if (rs.next()) {
			sql = "select invenuid from invepers where invepers=? and invedepa=? and invebode=? and inveprov=? and invecent=? and inveesma=? and invemate=? and inveentr=?";
			pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1, rs.getString("seripers"));
			pst.setString(2, rs.getString("seridepa"));
			pst.setString(3, rs.getString("seribode"));
			pst.setString(4, rs.getString("seriprov"));
			pst.setString(5, rs.getString("sericent"));
			pst.setString(6, rs.getString("seriesma"));
			pst.setString(7, rs.getString("serimate"));
			pst.setString(8, rs.getString("serientr"));

			ResultSet rsInventa = conexion.Query(pst);
			if (rsInventa.next()) {
				result = rsInventa.getInt("invenuid");
			} else {
				throw new SQLException("ID de stock de personal no encontrado");
			}

		} else {
			throw new SQLException("ID de serial no encontrado");
		}
		return result;
	}

	public ArrayList<ConsumoOrden> getConsumoByOrden(String orden,
			int tipo_consumo, String tipo_orden) throws SQLException {
		ArrayList<ConsumoOrden> lista = new ArrayList<ConsumoOrden>();
		String sql = "";
		if (tipo_consumo == 1) { // Material
			sql = "select consumos.id_consumo,consumos.cantidad,inventario_personal.* "
					+ "from consumos, inventario_personal "
					+ "where inventario_personal.invenuid = consumos.id_consumo "
					+ " and consumos.orden = ? and consumos.tipo_consumo = 1 and consumos.estado = 0"
					+ " and tipo_orden = ? order by inventario_personal.matedesc ";
			java.sql.PreparedStatement pst = conexion.getConnection()
					.prepareStatement(sql);
			pst.setString(1, orden);
			pst.setString(2, tipo_orden);
			ResultSet rs = conexion.Query(pst);
			while (rs.next()) {
				ConsumoOrden consumo = new ConsumoOrden();
				consumo.setId(rs.getString("invenuid"));
				if (rs.getString("inveprov").equals("CT")) {
					consumo.setMaterial(rs.getString("matesap"));
					consumo.setDescripcion(rs.getString("matesade"));
				} else {
					consumo.setMaterial(rs.getString("invemate"));
					consumo.setDescripcion(rs.getString("matedesc"));
				}
				consumo.setUnidad(rs.getString("mateunid"));
				consumo.setBodega(rs.getString("bodedesc"));
				consumo.setCentro(rs.getString("centdesc"));
				consumo.setEstado(rs.getString("estadesc"));
				consumo.setSuministro(rs.getString("inveprov"));
				consumo.setCantidad(rs.getDouble("invecant"));
				consumo.setReserva(rs.getDouble("cantidad"));
				consumo.setEntrega(rs.getString("inveentr"));
				consumo.setSerial("");
				consumo.setCasdid("");
				lista.add(consumo);

			}

		} else { // Serial
			sql = "select consumos.id_consumo,consumos.cantidad,seriales_personal.* "
					+ "from consumos, seriales_personal "
					+ "where seriales_personal.serinuid = consumos.id_consumo "
					+ " and consumos.orden = ? and consumos.tipo_consumo = 2 and consumos.estado = 0"
					+ " and tipo_orden = ? order by seriales_personal.matedesc ";
			java.sql.PreparedStatement pst = conexion.getConnection()
					.prepareStatement(sql);
			pst.setString(1, orden);
			pst.setString(2, tipo_orden);
			ResultSet rs = conexion.Query(pst);
			while (rs.next()) {
				ConsumoOrden consumo = new ConsumoOrden();
				consumo.setId(rs.getString("serinuid"));
				if (rs.getString("seriprov").equals("CT")) {
					consumo.setMaterial(rs.getString("matesap"));
					consumo.setDescripcion(rs.getString("matesade"));
				} else {
					consumo.setMaterial(rs.getString("serimate"));
					consumo.setDescripcion(rs.getString("matedesc"));
				}
				consumo.setUnidad(rs.getString("mateunid"));
				consumo.setBodega(rs.getString("bodedesc"));
				consumo.setCentro(rs.getString("centdesc"));
				consumo.setEstado(rs.getString("estadesc"));
				consumo.setSuministro(rs.getString("seriprov"));
				consumo.setCantidad(1);
				consumo.setReserva(rs.getDouble("cantidad"));
				consumo.setEntrega(rs.getString("serientr"));
				consumo.setSerial(rs.getString("sericodi"));
				consumo.setCasdid(rs.getString("sericaid"));
				lista.add(consumo);

			}

		}

		return lista;
	}

	public boolean ConfirmarConsumos(String orden, String tipo_orden)
			throws SQLException, NumberFormatException {

		String sql = "select * from consumos where orden=? and tipo_orden=? and estado=0";
		java.sql.PreparedStatement pst = conexion.getConnection()
				.prepareStatement(sql);
		pst.setString(1, orden);
		pst.setString(2, tipo_orden);
		ResultSet rs = conexion.Query(pst);
		while (rs.next()) {

			int tipo_consumo = rs.getInt("tipo_consumo");
			String id_consumo = rs.getString("id_consumo");
			String cedula = rs.getString("cedula");

			if (tipo_consumo == 1) { // Consumo de material
				double stock_actual = this.StockActual(id_consumo);
				double cantidad = rs.getDouble("cantidad");
				System.out.println("cantidad de descontar: " + cantidad);
				if (ActualizarStock(id_consumo, cantidad,
						OPERACION_DECREMENTAR, COMMIT_OFF)) {
					if (this.ActualizarReservaInventario(Integer.parseInt(id_consumo),
							cantidad, OPERACION_DECREMENTAR)) {
						if (AgregarConsumoOrden(id_consumo, orden, tipo_orden,
								cedula, cantidad, "", "", "-1", "3", COMMIT_OFF)) {
							if (!Kardex(id_consumo, orden, tipo_orden,
									cantidad, stock_actual,
									OPERACION_DECREMENTAR, COMMIT_OFF)) {
								throw new SQLException(
										"Error al registrar el kardex del movimiento del material");
							} else { // Actualizar estado consumos (de estado 0
										// pasa a 1)
								if (!ConfirmarIdConsumo(rs.getInt("id"),
										COMMIT_OFF)) {
									throw new SQLException(
											"Error al confirmar ID de consumo "
													+ rs.getInt("id"));
								}
							}

						} else {
							throw new SQLException(
									"Error al agregar el consumo a la orden de servicio");
						}
					} else {
						throw new SQLException(
								"Error al actualizar la reserva del  consumo");
					}

				} else {
					throw new SQLException(
							"Error al actualizar el stock del tecnico");
				}

			} else { // consumo de serial
				sql = "select * from seriales_personal where serinuid=?";
				pst = conexion.getConnection().prepareStatement(sql);
				pst.setString(1, id_consumo);
				ResultSet rsSerial = conexion.Query(pst);
				if (!rsSerial.next()) {
					throw new SQLException(
							"Error al consultar el id del serial");
				}

				String id_stock = Integer.toString(getIdStockByIdSerial(Integer
						.parseInt(id_consumo)));
				double stock_actual = this.StockActual(id_stock);
				double cantidad = 1.0;
				if (ActualizarStock(id_stock, cantidad, OPERACION_DECREMENTAR,
						COMMIT_OFF)) {
					if (this.ActualizarReservaInventario(Integer.parseInt(id_stock),
							cantidad, OPERACION_DECREMENTAR)) {
						if (AgregarConsumoOrden(id_stock, orden, tipo_orden,
								cedula, cantidad,
								rsSerial.getString("sericodi"),
								rsSerial.getString("sericaid"), id_consumo,
								"2", COMMIT_OFF)) {
							if (Kardex(id_stock, orden, tipo_orden, cantidad,
									stock_actual, OPERACION_DECREMENTAR,
									COMMIT_OFF)) {
								if (!InstalarSerial(id_consumo, orden,
										tipo_orden, cedula, COMMIT_OFF)) {
									throw new SQLException(
											"Error al instalar el serial");
								} else { // Actualizar estado consumos (de
											// estado 0 pasa a 1)
									if (!ConfirmarIdConsumo(rs.getInt("id"),
											COMMIT_OFF)) {
										throw new SQLException(
												"Error al confirmar ID de consumo "
														+ rs.getInt("id"));
									}
								}

							} else {
								throw new SQLException(
										"Error al registrar el kardex del movimiento del material");
							}

						} else {
							throw new SQLException(
									"Error al agregar el consumo a la orden de servicio");
						}
					} else {
						throw new SQLException(
								"Error al actualizar la reserva del  consumo");
					}

				} else {
					throw new SQLException(
							"Error al actualizar el stock del tecnico");
				}

			}

		}
		return true;
	}

	public boolean AnularConsumos(String orden, String tipo_orden, int mode)
			throws SQLException, NumberFormatException {

		String sql = "select * from consumos where orden=? and tipo_orden=? and estado = 0";
		java.sql.PreparedStatement pst = conexion.getConnection()
				.prepareStatement(sql);
		pst.setString(1, orden);
		pst.setString(2, tipo_orden);
		ResultSet rs = conexion.Query(pst);
		while (rs.next()) {

			int tipo_consumo = rs.getInt("tipo_consumo");
			int id_consumo = rs.getInt("id_consumo");

			if (tipo_consumo == 1) { // Consumo de material

				double cantidad = rs.getDouble("cantidad");
				if (this.ActualizarReservaInventario(id_consumo, cantidad,
						OPERACION_DECREMENTAR)) {
					if (!this.AnularIdConsumo(rs.getInt("id"), mode)) {
						throw new SQLException("Error anular id de consumo "
								+ rs.getInt("id"));
					}

				} else {
					throw new SQLException("Error al actualizar la reserva");
				}

			} else { // consumo de serial
				sql = "select * from seriales_personal where serinuid=?";
				pst = conexion.getConnection().prepareStatement(sql);
				pst.setInt(1, id_consumo);
				ResultSet rsSerial = conexion.Query(pst);
				if (!rsSerial.next()) {
					throw new SQLException(
							"Error al consultar el id del serial");
				}

				int id_stock = getIdStockByIdSerial(id_consumo);
				double cantidad = 1.0;

				if (this.ActualizarReservaInventario(id_stock, cantidad,
						OPERACION_DECREMENTAR)) {
					if (this.LiberarSerial(id_consumo, COMMIT_OFF)) {
						if (!this.AnularIdConsumo(rs.getInt("id"), mode)) {
							throw new SQLException(
									"Error anular id de consumo "
											+ rs.getInt("id"));
						}
					} else {
						throw new SQLException(
								"Error al liberar el serial reservado "
										+ rsSerial.getString("sericodi"));
					}

				} else {
					throw new SQLException("Error al actualizar la reserva");
				}

			}

		}
		return true;
	}

	public boolean ConfirmarIdConsumo(int id, int mode) throws SQLException {
		boolean result = true;
		String sql = "update consumos set estado=1 where id=? and estado=0 ";
		java.sql.PreparedStatement pst = conexion.getConnection()
				.prepareStatement(sql);
		pst.setInt(1, id);
		if (conexion.Update(pst) > 0) {
			if (mode == COMMIT_ON) {
				conexion.Commit();
			}
			result = true;
		}

		return result;
	}

	public boolean AnularIdConsumo(int id, int mode) throws SQLException {
		boolean result = true;
		String sql = "update consumos set estado=2 where id=? and estado=0 ";
		java.sql.PreparedStatement pst = conexion.getConnection()
				.prepareStatement(sql);
		pst.setInt(1, id);
		if (conexion.Update(pst) > 0) {
			if (mode == COMMIT_ON) {
				conexion.Commit();
			}
			result = true;
		}

		return result;
	}

}
